"""
图像API：此文件用于提供后端服务，即获取图像数据
"""

import logging
from fastapi import APIRouter, HTTPException
from fastapi.responses import FileResponse
import os
from utils.image_reader import get_image_info

# 创建日志记录器
logger = logging.getLogger(__name__)

# 创建API路由路由器
router = APIRouter(prefix="/api/datasets", tags=["images"])


# 获取特定图像的数据
@router.get("/{dataset_id}/images/{image_id}/data")
def get_image_data(dataset_id: str, image_id: str):
    """
    根据数据集ID和图像ID获取特定图像的二进制数据

    Args:
        dataset_id: 数据集ID
        image_id: 图像ID

    Returns:
        图像文件的二进制数据（统一扩展名）

    Raises:
        HTTPException: 当图像不存在时抛出404错误
    """
    logger.info(f"请求获取图像数据，数据集ID: {dataset_id}, 图像ID: {image_id}")

    try:
        # 获取图像信息
        image_info = get_image_info(image_id, dataset_id)

        if image_info is None:
            logger.warning(
                f"未找到图像信息，数据集ID: {dataset_id}, 图像ID: {image_id}"
            )
            raise HTTPException(status_code=404, detail="图像未找到")

        logger.debug(f"找到图像信息: {image_info}")

        # 检查文件是否存在
        if not os.path.exists(image_info["path"]):
            logger.warning(f"图像文件不存在，路径: {image_info['path']}")
            raise HTTPException(status_code=404, detail="图像文件不存在")

        # 统一文件扩展名
        file_path = image_info["path"]
        file_ext = os.path.splitext(file_path)[1].lower()
        # print(file_ext)

        # 如果扩展名是 .gz，检查是否实际是 .nii.gz
        if file_ext == ".gz":
            # 检查文件名是否包含 .nii（如 data.nii.gz）
            if ".nii" in os.path.basename(file_path):
                media_type = "application/gzip"  # 明确标记为 NIfTI
                download_name = os.path.basename(file_path)  # 保持原始文件名
            else:
                # 默认按 2D 图像处理（如 JPG 压缩包）
                media_type = "image/jpeg"  # 或其他 2D 图像类型
                download_name = f"{image_id}.jpg"
        else:
            # 非 .gz 文件（如 .nii, .jpg, .png）
            media_type = _get_media_type(file_ext)  # 根据扩展名确定类型
            download_name = f"{image_id}{file_ext}"  # 使用原始扩展名

        logger.info(
            f"成功获取图像数据，数据集ID: {dataset_id}, 图像ID: {image_id}, 文件路径: {file_path}"
        )

        # 返回文件（指定下载名和媒体类型）
        return FileResponse(
            file_path,
            media_type=media_type,
            filename=download_name,  # 前端下载时显示的文件名
        )

    except HTTPException:
        raise
    except Exception as e:
        logger.error(
            f"获取图像数据时发生错误，数据集ID: {dataset_id}, 图像ID: {image_id}, 错误: {str(e)}"
        )
        raise HTTPException(status_code=500, detail="内部服务器错误")


def _get_media_type(file_ext: str) -> str:
    """根据文件扩展名返回媒体类型"""
    media_types = {
        ".nii": "application/nii",
        ".nii.gz": "application/gzip",
        ".dcm": "application/dicom",
        ".jpg": "image/jpeg",
        ".png": "image/png",
        ".bmp": "image/bmp",
    }
    return media_types.get(file_ext, "application/octet-stream")
